package com.qf.listener;

import com.alibaba.fastjson.JSON;
import com.qf.pojo.UserMsg;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
@RocketMQTransactionListener
public class TransactionConsumer5 implements RocketMQLocalTransactionListener {

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /*
        半消息发送成功后的回调，在这个方法中执行本地事务
        返回状态：
            commit -- 半消息会进入目标主题，最终就会由我们的消费者消息，执行另一半的本地事务
            rollback -- 半消息会删除，我们消费者不会执行任何操作
            unknow -- 触发回查的回调
     */
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        //处理本地事务 -- 数据库操作
        try {
            byte[] payload = (byte[]) msg.getPayload();
            String json = new String(payload, "utf-8");

            UserMsg userMsg = JSON.parseObject(json, UserMsg.class);
            Integer id = userMsg.getId();
            if (id == 1){
                //处理成功
                System.out.println("commit");
                return RocketMQLocalTransactionState.COMMIT;
            }else if (id == 2){
                //处理失败
                System.out.println("rollback");
                return RocketMQLocalTransactionState.ROLLBACK;
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //状态未知
        System.out.println("unknow");
        return RocketMQLocalTransactionState.UNKNOWN;
    }

    /*
        本地事务执行后的状态是未知的，半消息主题会触发这个回调，在这个方法中检查数据库表中本地事务的相关表的数据
        返回状态：
            commit -- 半消息会进入目标主题，最终就会由我们的消费者消息，执行另一半的本地事务
            rollback -- 半消息会删除，我们消费者不会执行任何操作
            unknow -- 触发回查的回调 （默认是1分钟回查一次，一共回查15次）
     */
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        String format = sdf.format(new Date());
        System.out.println("状态回查,时间为: " + format);
        return RocketMQLocalTransactionState.UNKNOWN;
    }
}
